perm filename MATCHR.L70[L70,TES] blob sn#029354 filedate 1973-03-09 generic text, type T, neo UTF8
00100	<FN PATTERN1 → PATTERN2>
00200		CALLS FN WITH THE INPUT STREAM PATTERN1
00300		BINDS ITS RESULT TO THE OUTPUT STREAM PATTERN2
00400	
00500	IN A DEC, THE ADDITIONAL VARIABLES :SOURCE AND ::SOURCE ARE
00600		AVAILABLE TO REPRESENT ONE ELEMENT OF THE SOURCE AND
00700		AS MANY ELEMENTS AS DESIRED OF THE SOURCE RESPECTIVELY.
00800	
00900	IN A REC, THE ADDITIONAL VARIABLES :SINK AND ::SINK ARE
01000		AVAILABLE TO REPRESENT ONE ELEMENT OF THE SINK AND
01100		AS MANY ELEMENTS AS DESIRED OF THE SINK RESPECTIVELY.
01200	
01300	IF EITHER PATTERN1 OR PATTERN2 IS COMPLETELY EMPTY, THEN
01400		THE DEFAULT IS ::SOURCE IN THE DEC AND ::SINK IN THE REC.
01500	ALSO 	ITEM@FN  IS AN ABBREVIATION FOR <FN ITEM>.
01600	THUS, THE OLD NOTATION IS COMPATIBLE.
01700	BUT WE SHOULD STOP USING @ AND DISCOURAGE THE USE OF <FN>:X.
01800	
01900	TO REVERSE A RULE,
02000		<FN  :SOURCE B → C ::SOURCE>
02100	CHANGES TO
02200		<<INVERSE FN>  C ::SINK → :SINK B>.
02300	NOTE- C ::SINK  MEANS THE ATOM C AND THEN SOME THINGS THAT ARE ABOUT TO GO
02400		ONTO THE SINK.
02500	
02600	RULES OF EXPRESSION =
02700		IF <EXPRESSION→:X> THEN <EXPRESSION→:Y> ELSE <EXPRESSION→:Z>
02800		→ (COND (:X :Y)(T :Z)) ;
02900	
03000	RULES OF INVERSE EXPRESSION =
03100		(COND (:X :Y)(T :Z))
03200		IF <<INVERSE EXPRESSION> :X> THEN <<INVERSE EXPRESSION> :Y>
03300			ELSE <<INVERSE EXPRESSION>:Y> ;
03400	
03500	RULES OF OPTIMIZE =
03600		[<PEEPHOLE>|:X]* → ::X ;
03700	
03800	RULES OF ALT =
03900		(... :X ...) ::STR → <MATCH :X ::STR> ;
04000	
04100	RULES OF MATCH =
04200		(LITERAL :X) :X → ,
04300		(COLON :X) :Y #WHERE# ALIST=(... (:X :Y)...) → ,
04400		(COLON :X) :Y #WHERE# ALIST=(... (:X :Z)...) → <FAILURE>,
04500		(COLON :X) :Y → #WHERE# ALIST = (##(ALIST) (:X :Y)),
04600		(CALL :FN :INS :OUTS) :Y #WHERE# FUNCTIONS= (... (:FN :RULE)...)
04700			→ <MATCH :OUTS <APPLY :RULE :INS>>,
04800		ETC. ;
04900	
05000	RULES OF APPLY =
05100		(LAMDA .. ..) → .....,
05200		(REWRITE :DEC :REC) <MATCH :DEC ::STREAM → #WHERE# ALIST=:A>
05300			→ <EVAL :REC :A> ;
05400	
05500	RULES OF EVAL =
05600		(:FN ...) → <APPLY :FN ...>,
05700		:X #WHERE# ALIST=(... (:X :V)...) → :V ;